package com.canyou.utils;

import java.util.concurrent.Callable;

/**
 * 异常重试工具类
 *
 * @author fy
 * @date 2019-05-07 17:00
 */
public final class RetryUtils {

    private RetryUtils() {
    }

    /**
     * 在遇到异常时尝试重试
     *
     * @param callable   回调的方法, 该方法必须要保证在失败时抛出异常
     * @param retryLimit 重试次数
     * @param <T>        返回值类型
     * @return
     */
    public static <T> T retryOnException(Callable<? extends T> callable, int retryLimit) {
        for (int i = 0; i < retryLimit; i++) {
            try {
                return callable.call();
            } catch (Exception e) {
                if (i >= retryLimit - 1) {
                    if (e instanceof RuntimeException) {
                        throw (RuntimeException) e;
                    } else {
                        throw new RuntimeException(e);
                    }
                }
            }
        }
        return null;
    }

    /**
     * 在遇到异常时尝试重试3次
     *
     * @param callable 回调的方法, 该方法必须要保证在失败时抛出异常
     * @param <T>      返回值类型
     * @return
     */
    public static <T> T retryOnException(Callable<? extends T> callable) {
        return retryOnException(callable, 3);
    }

}
